/*
	Compresor Gzip
    Copyright (C) 2012 Darío López Padial 
    @bukosabino

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>
*/

/**
	@file vectordinamico.h
	@brief Especificación de la clase VD.
	@author Dario Lopez Padial.
*/

#ifndef _vector_dinamico_H_
#define _vector_dinamico_H_

#include <iostream>

/**
@class	VD
@brief	Es un tipo de dato que facilitará el uso de cadenas de caracteres de cualquier longitud, 
		se creará en memoria dinámica.
*/
class VD {

	private:

		unsigned char * _vector;
  		unsigned int _tamanio;

	public:

		/**
		@brief:	Constructor.
				Constructor por defecto si no hay parámetros, y primitivo si los hubiera.
		*/
		VD(unsigned int n = 0) {
			_vector = new unsigned char [n];
			_tamanio = n;
		};

		/**
		@brief:	Constructor de copias.
		*/
		VD (const VD & v);
 
		/**
		@brief:	Destructor, libera los recursos ocupados por el vector.
		*/
		~VD() {
			delete [] _vector;
		}

		/**
		@brief:	Devuelve el número de elementos almacenados en el vector.
		*/
		unsigned int const Size () {
			return _tamanio;
		}

		/**
		@brief:		Modifica el elemento i-ésimo al valor c.
		@param i:	Posición del vector que queremos modificar.
		@param c:	Valor insertado en el vector dinámico.
		*/
		void Set (unsigned int i, unsigned char c) {
			_vector[i] = c;
		}

		/**
		@brief:		Devuelve el caracter del vector dinámico en la posicón i-ésima.
		@param i:	Posición del vector que queremos consultar.
		@return:	Devuelve un caracter del vector dinámico.
		*/
		unsigned char Get (unsigned int i) const {
			return _vector[i];
		}

		/**
		@brief:		Modifica el tamaño del vector a la dimensión n. Los valores almacenados antes de la redimensión no
 					se pierden (excepto los que se salen del nuevo rango de índice).
		@param n:	indicará el número de elementos a los que queremos redimensionar el vector.
		*/
		void Resize (unsigned int n);

		/**
		@brief:		Añade un nuevo elemento al vector.
		param c:	Carácter que será añadido.
		*/
		void Add (unsigned char c);

		/**
		@brief:		Almacena en el vector la información de un flujo de entrada.
		param is:	Flujo de entrada.
		*/
		void Leer (std::istream & is);

		/** 
		@brief:	Escribe un vector dinámico en cout.
		*/
		void const Escribir ();

		/**
		@brief:		Operador de asignación.
		@param v:	Es el vector "emisor" en la asignación.
					Para asignar vectores dinámicos entre sí.
		*/
		VD & operator = (const VD  & v);
};
#endif
